using Engine.DynamicObjectManager;
using System.IO;

namespace Engine.FileFormats3D.C11Undercover.QADFile
{
    public class Object : BaseObject
    {
        #region Public Fields

        public ObjectName name;
        public int objectPropertieID;

        public float positionX;
        public float positionZ;

        #endregion Public Fields

        #region Private Fields

        private float ausrichtung1;
        private float ausrichtung2;
        private float ausrichtung3;
        private float cosisnus;
        private float keineAhnung;
        private short keineAhnung10;
        private short keineAhnung11;
        private short keineAhnung12;
        private byte[] keineAhnung2 = new byte[4];
        private byte[] keineAhnung3 = new byte[4];
        private byte[] keineAhnung4 = new byte[4];
        private short keineAhnung5;
        private short keineAhnung6;
        private short keineAhnung7;
        private short keineAhnung8;
        private short keineAhnung9;
        private float negativerCosinus;
        private float negativerSinus;
        private float positionY;
        private float sinus;
        private float size;

        #endregion Private Fields

        #region Public Constructors

        public Object(string name, int ObjectPropertyId, float x, float y, float z)
        {
            this.ausrichtung1 = 0.0f;
            this.ausrichtung2 = 0.0f;
            this.ausrichtung3 = 0.0f;
            this.cosisnus = 0.0f;
            this.keineAhnung = 0.0f;
            //byte[] keineAhnung2 = new byte[4];
            //byte[] keineAhnung3 = new byte[4];
            //byte[] keineAhnung4 = new byte[8];
            this.name = new ObjectName(name);
            this.negativerCosinus = 0.0f;
            this.negativerSinus = 0.0f;
            this.objectPropertieID = ObjectPropertyId;
            this.positionX = x;
            this.positionY = y;
            this.positionZ = z;
            this.sinus = 0.0f;
            this.size = 1.0f;
        }

        public Object()
        {
            this.ausrichtung1 = 0.0f;
            this.ausrichtung2 = 0.0f;
            this.ausrichtung3 = 0.0f;
            this.cosisnus = 0.0f;
            this.keineAhnung = 0.0f;
            //byte[] keineAhnung2 = new byte[4];
            //byte[] keineAhnung3 = new byte[4];
            //byte[] keineAhnung4 = new byte[8];
            this.name = new ObjectName("not defined!");
            this.negativerCosinus = 0.0f;
            this.negativerSinus = 0.0f;
            this.objectPropertieID = 0;
            this.positionX = 0.0f;
            this.positionY = 0.0f;
            this.positionZ = 0.0f;
            this.sinus = 0.0f;
            this.size = 1.0f;
        }

        #endregion Public Constructors

        #region Public Methods

        public override string ToString()
        {
            return this.name.ToString();
        }

        #endregion Public Methods

        #region Internal Methods

        internal static Object FromStream(BinaryReader br)
        {
            long positionStart = br.BaseStream.Position;
            Object obj = new Object();
            obj.name = ObjectName.FromStream(br);
            obj.objectPropertieID = br.ReadInt32();
            obj.positionX = br.ReadSingle();
            obj.positionY = br.ReadSingle();
            obj.positionZ = br.ReadSingle();
            obj.keineAhnung = br.ReadSingle();
            obj.size = br.ReadSingle();
            obj.cosisnus = br.ReadSingle();
            obj.keineAhnung2 = br.ReadBytes(4); ;// war 0
            obj.sinus = br.ReadSingle();
            obj.ausrichtung1 = br.ReadSingle();// 0 vieleicht keine Ahnung
            obj.ausrichtung2 = br.ReadSingle();// 1
            obj.ausrichtung3 = br.ReadSingle();// 0
            obj.negativerSinus = br.ReadSingle();
            obj.keineAhnung3 = br.ReadBytes(4);
            obj.negativerCosinus = br.ReadSingle();
            obj.keineAhnung4 = br.ReadBytes(4);

            obj.keineAhnung5 = br.ReadInt16();
            obj.keineAhnung6 = br.ReadInt16();
            obj.keineAhnung7 = br.ReadInt16();
            obj.keineAhnung8 = br.ReadInt16();

            obj.keineAhnung9 = br.ReadInt16();
            obj.keineAhnung10 = br.ReadInt16();
            obj.keineAhnung11 = br.ReadInt16();
            obj.keineAhnung12 = br.ReadInt16();

            //br.BaseStream.Position += 16;
            positionStart = br.BaseStream.Position - positionStart;
            return obj;
        }

        internal void Save(BinaryWriter bw)
        {
            this.name.Save(bw); //obj.name = ObjectName.LoadFromStream(br); // 0
            bw.Write((int)this.objectPropertieID);//obj.objectPropertieID = br.ReadInt32(); // 32
            bw.Write((float)this.positionX);//obj.positionX = br.ReadSingle(); // 36
            bw.Write((float)this.positionY);//obj.positionY = br.ReadSingle(); // 40
            bw.Write((float)this.positionZ);//obj.positionZ = br.ReadSingle(); // 44
            bw.Write((float)this.keineAhnung);//obj.keineAhnung = br.ReadSingle(); // 48
            bw.Write((float)this.size);//obj.size = br.ReadSingle(); // 52
            bw.Write((float)this.cosisnus); //obj.cosisnus = br.ReadSingle(); // 56
            bw.Write(this.keineAhnung2);//obj.keineAhnung2 = br.ReadBytes(4); ;// war 0 // 60
            bw.Write((float)this.sinus); //obj.sinus = br.ReadSingle(); // 64
            bw.Write((float)this.ausrichtung1);   //obj.ausrichtung1 = br.ReadSingle();// 0 vieleicht keine Ahnung // 68
            bw.Write((float)this.ausrichtung2); //obj.ausrichtung2 = br.ReadSingle();// 1 // 72
            bw.Write((float)this.ausrichtung3); //obj.ausrichtung3 = br.ReadSingle();// 0 // 76
            bw.Write((float)this.negativerSinus); //obj.negativerSinus = br.ReadSingle(); // 80
            bw.Write(this.keineAhnung3);//obj.keineAhnung3 = br.ReadBytes(4); // 84
            bw.Write((float)this.negativerCosinus); //obj.negativerCosinus = br.ReadSingle(); // 88
            bw.Write(this.keineAhnung4);//obj.keineAhnung4 = br.ReadBytes(8); // 92
            bw.Write(this.keineAhnung5); // 96
            bw.Write(this.keineAhnung6); // 98
            bw.Write(this.keineAhnung7); // 100
            bw.Write(this.keineAhnung8); // 102
            bw.Write(this.keineAhnung9); // 104
            bw.Write(this.keineAhnung10); // 106
            bw.Write(this.keineAhnung11); // 108
            bw.Write(this.keineAhnung12); // 110
            // 112 Bytes long
        }

        #endregion Internal Methods
    }
}